home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
data
/
awkscrpt
/
asmz80.awk
< prev
next >
Wrap
Text File
|
1995-02-11
|
7KB
|
324 lines
BEGIN {
err="/dev/stderr"
printf("\n超高速(嘘)Z80クロスアセンブラ") >err
printf(" ASMZ80\t\tBy Jouji\n\n") >err
if(tmp=="") tmp="asmz80.tmp"
dat="asmz80.dat"
em[1]="不正なオペレーションコードが使われている"
em[2]="文法違反"
em[3]="未定義シンボルが使われている"
em[4]="相対ジャンプ先が範囲を越えている"
em[5]="変位の値が範囲を越えている"
em[6]="不正なアドレスが指定されている"
em[7]="シンボルが二重に定義されている"
print "ニーモニックテーブルにデータをセットしています‥‥" >err
oc="^(LD|PUSH|POP|EX|EXX|LDI|LDIR|LDD|LDDR|CPI|CPIR|CPD|CPDR|DAA|CPL|NEG|CCF|SCF|NOP|HALT|DI|EI|ADD|ADC|SUB|SBC|AND|OR|XOR|CP|INC|DEC|RLCA|RLA|RRCA|RRA|RLD|RRD|JP|JR|DJNZ|CALL|RET|RETI|RETN|IN|INI|INIR|IND|INDR|OUT|OUTI|OUTIR|OUTD|OUTDR)$"
r1="^([ABCDEHLIRFZPM]|\\((C|BC|DE|HL|IX|IY|SP)\\)|AF'?|BC|DE|HL|IX|IY|SP|NZ|NC|PO|PE)$"
r2="^([ABCDEHLIR]|\\((C|BC|DE|HL|IX|IY)\\)|AF'|BC|DE|HL|IX|IY|SP)$"
while(getline<dat >0) {s=$0;sub(/^.*\t/,"",s);ob[$1]=s}
r["B"]=0;r["C"]=1;r["D"]=2;r["E"]=3;r["H"]=4;r["L"]=5;r["(HL)"]=6;r["A"]=7
as["ADD"]=128;as["ADC"]=136;as["SBC"]=152
er["SUB"]=144;er["AND"]=160;er["XOR"]=168;er["OR"]=176;er["CP"]=184
id["INC"]=4;id["DEC"]=5
rs["RLC"]=0;rs["RRC"]=8;rs["RL"]=16;rs["RR"]=24
rs["SLA"]=32;rs["SRA"]=40;rs["SRL"]=56
b["BIT"]=64;b["RES"]=128;b["SET"]=192
FS=",|[ \t]+"
h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6
h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13
h["E"]=14;h["F"]=15
for(i=32;i<256;i++) asc[sprintf("%c",i)]=i
print "パス1の処理中‥‥" >err
}
{ sub(/;.*$/,"")
if($0=="") next
while($0~/'.+'/) {
a=index($0,"'")
s=substr($0,1,a-1)
t=substr($0,a+1)
a=index(t,"'")
u=substr(t,1,a-1)
t=substr(t,a+1)
l=length(u)
v=""
for(i=1;i<=l;i++) {
c=substr(u,i,1)
v=v sprintf("%d,",asc[c])
}
sub(/.$/,"",v)
$0=s v t
}
$0=toupper($0)
}
$1!="" {
sub(/:+$/,"",$1)
if($1 in st) error(7,NR)
st[$1]=addr
}
$2=="EQU" {st[$1]=tonum($3);next}
$2=="ORG" {
a=tonum($3)
if(a<addr) error(6,NR)
addr=a
next
}
$2=="DB" {
printf("%04d %04X",NR,addr) >tmp
for(i=3;i<=NF && $i!="";i++) {
if($i~/^[0-9]/) printf(" %02X",tonum($i)%256) >tmp
else printf(" @1%s",$i) >tmp
addr++
}
print"" >tmp
next
}
$2=="DW" {
printf("%04d %04X",NR,addr) >tmp
for(i=3;i<=NF && $i!="";i++) {
if($i~/^[0-9]/) {
n=tonum($i)
printf(" %02X %02X",n%256,int(n/256)) >tmp
} else
printf(" @2%s",$i) >tmp
addr+=2
}
print"" >tmp
next
}
$2=="DS" {
n=tonum($3)
for(i=1;i<=n;i++) printf("%04d D%04X 00\n",NR,addr++) >tmp
next
}
$2=="END" {exit}
$2=="" {next}
{fl=0;op=$2}
op=="IM" {
if($3=="0") c="46"
else if($3=="1") c="56"
else if($3=="2") c="5E"
else error(2,NR)
printf("%04d %04X ED %s\n",NR,addr,c) >tmp
addr+=2
next
}
op=="RST" {
n=tonum($3)
if(n<8) n=8*n
if(n<57 && n%8==0) c=199+n; else error(2,NR)
printf("%04d %04X %02X\n",NR,addr,c) >tmp
addr++
next
}
op=="LD" {
if(($3 in r)&&($4 in r)) {
c=64+8*r[$3]+r[$4]
printf("%04d %04X %02X\n",NR,addr,c) >tmp
addr++
next
}
if(($3 in r)&&($4~/^\(I[XY].*\)$/)) {
c=70+8*r[$3]
s=ixiy($4)
printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
addr+=3
next
}
if($3~/^\(I[XY].*\)$/) {
s=ixiy($3)
if($4 in r) {
c=112+r[$4]
a=addr+3
} else {
c=54
if($4~/^[0-9]/) {
n=tonum($4)
s=s sprintf(" %02X",n%256)
} else
s=s" @1"$4
a=addr+4
}
printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
addr=a
next
}
}
(op in as)&&($3=="A") {
if($4 in r) {
c=as[op]+r[$4]
printf("%04d %04X %02X\n",NR,addr,c) >tmp
addr++
next
}
if($4~/^\(I[XY].*\)$/) {
c=as[op]+6
s=ixiy($4)
printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
addr+=3
next
}
}
(op in er) {
if($3 in r) {
c=er[op]+r[$3]
printf("%04d %04X %02X\n",NR,addr,c) >tmp
addr++
next
}
if($3~/^\(I[XY].*\)$/) {
c=er[op]+6
s=ixiy($3)
printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
addr+=3
next
}
}
(op in id) {
if($3 in r) {
c=id[op]+8*r[$3]
printf("%04d %04X %02X\n",NR,addr,c) >tmp
addr++
next
} else if($3~/^\(I[XY].*\)$/) {
c=id[op]+48
s=ixiy($3)
printf("%04d %04X %s %02X %s\n",NR,addr,xy,c,s) >tmp
addr+=3
next
}
}
(op in rs) {
if($3 in r) {
c=rs[op]+r[$3]
printf("%04d %04X CB %02X\n",NR,addr,c) >tmp
addr+=2
} else if($3~/^\(I[XY].*\)$/) {
c=rs[op]+6
s=ixiy($3)
printf("%04d %04X %s CB %s %02X\n",NR,addr,xy,s,c) >tmp
addr+=4
} else error(2,NR)
next
}
(op in b)&&($3~/^[0-7]$/) {
if($4 in r) {
c=b[op]+8*$3+r[$4]
printf("%04d %04X CB %02X\n",NR,addr,c) >tmp
addr+=2
} else if($4~/^\(I[XY].*\)$/) {
c=b[op]+8*$3+6
s=ixiy($4)
printf("%04d %04X %s CB %s %02X\n",NR,addr,xy,s,c) >tmp
addr+=4
} else error(2,NR)
next
}
op!~oc {error(1,NR)}
$3!="" {
if($3~r1)
op=op $3
else if($3~/^\(.+\)$/) {
fl=1
l=$3
gsub(/[()]/,"",l)
op=op "(?)"}
else {
fl=1
l=$3
op=op "?"}
}
$4!="" {
if($4~r2)
op=op $4
else if($4~/^\(.+\)$/) {
fl=1
l=$4
gsub(/[()]/,"",l)
op=op "(?)"}
else {
fl=1
l=$4
op=op "?"}
}
{ if(!(op in ob)) error(2,NR)
split(ob[op],x)
printf("%04d %04X",NR,addr) >tmp
for(i=1;i<=x[1];i++) printf(" %s",x[i+2]) >tmp
addr+=x[1]+x[2]
if(fl==0) {print"" >tmp;next}
if(l~/^[0-9]/) {
n=tonum(l)
printf(" %02X",n%256) >tmp
if(x[2]==2) printf(" %02X",int(n/256)) >tmp
} else if($2~/^(JR|DJNZ)$/) printf(" @e%s",l) >tmp
else printf(" @%1d%s",x[2],l) >tmp
print"" >tmp
}
END {
print"" >tmp
for(s in st) printf("%04X %s\n",st[s],s) >tmp
close(tmp)
if(errf==1) exit
printf("パス2の処理中‥‥\n\n") >err
while(getline<tmp >0 && $0!="") {
for(i=3;i<=NF;i++)
if($i~/^@/) {
nr=substr($i,2,1)
l=substr($i,3)
if(!(l in st)) error(3,$1)
n=st[l]
if(nr=="e") {
addr=tonum("0"$2"H")
e=n-(addr+2)
if(e>127||e<-128) error(4,$1)
e=(e<0)?e+256:e
$i=sprintf("%02X",e)
} else if(nr~/[+-]/) {
if(nr=="-") n=-n
if(n<-128||n>255) error(5,$1)
if(n<0) n+=256
$i=sprintf("%02X",n)
} else {
$i=sprintf("%02X",n%256)
if(nr=="2") $i=$i sprintf(" %02X",int(n/256))
}
}
print
}
}
function tonum(s, i,m,n,c) {
if(s!~/^[0-9]/) return 0
if(s!~/H$/) return s+0
m=length(s)
for(i=1;i<m;i++) {
c=substr(s,i,1)
if(c!~/^[0-9A-F]$/) return n
n=16*n+h[c]
}
return n
}
function ixiy(s) {
xy=index(s,"IX")?"DD":"FD"
l=substr(s,4);sub(/.$/,"",l)
if(l=="") l="+0"
if(l!~/^[+-]/) error(2,NR)
pm=substr(l,1,1);sub(/^./,"",l)
if(l~/^[0-9]/) {
n=tonum(l)
if(pm=="-") n=-n
if(n<-128||n>255) error(5,NR)
if(n<0) n+=256
return sprintf("%02X",n)
} else return ("@" pm l)
}
function error(i,s) {
print em[i] ": " s " 行" >err
errf=1
exit
}